import subprocess
from socket import *
import struct

server = socket(AF_INET, SOCK_STREAM)

server.bind(('127.0.0.1', 8080))

server.listen(5)  # 5 指半连接池的大小

while True:

    conn, client_addr = server.accept()

    while True:
        try:
            cmd = conn.recv(8096)
            if len(cmd) == 0:
                break
            print(cmd.decode('utf-8'))
            # 执行命令
            obj = subprocess.Popen(
                cmd.decode('utf-8'),
                shell=True,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            stdout_res = obj.stdout.read()
            stderr_res = obj.stderr.read()
            total_size = len(stderr_res) + len(stdout_res)
            # 1.先发送头信息（固定长度的bytes）：对数据的秒数
            # 通过struct模块将int转换为固定长度bytes
            header = struct.pack('i', total_size)
            conn.send(header)

            # 最终解决方案，json头部信息，
            # struct头部的长度，
            # 先传输头部长度

            # 真实数据
            conn.send(stdout_res)
            conn.send(stderr_res)

        except Exception:
            break

    conn.close()
